﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLCidade : BLBase
    {
        // Representa o objeto de acesso a dados
        private DACidade daCidade = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLCidade()
            : base("DEFAULT")
        {
            daCidade = new DACidade("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLCidade(string tenantId)
            : base(tenantId)
        {
            daCidade = new DACidade(tenantId);
        }

        /// <summary>
        /// Consulta cidades (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="nmCidade">Nome da cidade</param>
        /// <param name="sgUF">Sigla do estado</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de cidades</returns>
        public List<CIDADE> consultarCidades(string nmCidade, string sgUF, string inAtivo, int maximumRows,
            int startRowIndex, string sortExpression)
        {
            List<CIDADE> retorno = null;

            try
            {
                retorno = this.daCidade.consultarCidades(nmCidade, sgUF, inAtivo, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta cidades (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="nmCidade">Nome da cidade</param>
        /// <param name="sgUF">Sigla do estado</param>
        /// <param name="inAtivo">indicador se está ativo ou inativo</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarCidadesCount(string nmCidade, string sgUF, string inAtivo)
        {
            int retorno = 0;

            try
            {
                retorno = daCidade.consultarCidadesCount(nmCidade, sgUF, inAtivo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem uma cidade
        /// </summary>
        /// <param name="cdCidade">Código da cidade</param>
        /// <returns>Entidade cidade</returns>
        public CIDADE obterCidade(int cdCidade)
        {
            CIDADE retorno = null;

            try
            {
                retorno = daCidade.obterCidade(cdCidade);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem uma cidade
        /// </summary>
        /// <param name="cdCidade">Código da cidade</param>
        /// <returns>Lista contendo uma cidade</returns>
        public List<CIDADE> listarCidade(int cdCidade)
        {
            List<CIDADE> retorno = null;

            try
            {
                retorno = this.daCidade.listarCidade(cdCidade);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #region Métodas de validação

        /// <summary>
        /// Verifica se existe uma cidade com o nome informado, no estado
        /// </summary>
        /// <param name="nmCidade">Nome da cidade</param>
        /// <param name="cdUF">Sigla do estado</param>
        /// <returns>Existe ou não (true/false)</returns>
        public bool existeCidadePorUF(string nmCidade, string cdUF)
        {
            bool retorno = false;

            try
            {
                retorno = this.daCidade.existeCidadePorUF(nmCidade, cdUF);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #endregion

        #region Métodos para Combos

        /// <summary>
        /// Lista as cidade ativas
        /// </summary>
        /// <returns>Lista de cidades</returns>
        public List<CIDADE> listarCidadesAtivas()
        {
            List<CIDADE> retorno = null;

            try
            {
                retorno = this.daCidade.listarCidadesAtivas();
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #endregion

        #region Métodas básicos - CRUD

        /// <summary>
        /// Insere uma cidade
        /// </summary>
        /// <param name="entity">Entidade cidade</param>
        /// <returns>Código da cidade</returns>
        public int inserirCidade(CIDADE entity)
        {
            int retorno = 0;

            try
            {
                retorno = this.daCidade.inserirCidade(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de uma cidade
        /// </summary>
        /// <param name="entity">Entidade cidade</param>
        public void atualizarCidade(CIDADE entity)
        {
            try
            {
                this.daCidade.atualizarCidade(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui uma cidade
        /// </summary>
        /// <param name="entity">Entidade cidade</param>
        public void excluirCidade(CIDADE entity)
        {
            try
            {
                this.daCidade.excluirCidade(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion


    }
}
